package com.spzx.product.controller;


import com.github.pagehelper.PageHelper;
import com.spzx.common.core.domain.R;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.AjaxResult;
import com.spzx.common.core.web.page.TableDataInfo;
import com.spzx.common.security.annotation.InnerAuth;
import com.spzx.product.api.domain.*;
import com.spzx.product.api.domain.vo.SkuStockVo;
import com.spzx.product.service.ProductService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 商品 前端控制器
 * </p>
 *
 * @author Haoran Sun
 * @since 2024-07-15
 */
@RestController
@RequestMapping("/product")
@Tag(name = "商品的信息管理")
public class ProductController extends BaseController {

    @Resource
    private ProductService productService;

    /**
     * 根据条件分页查询商品列表
     * @param product 查询条件
     * @return  商品列表
     */
    @Operation(summary = "分页查询商品列表")
    @GetMapping("list")
    public TableDataInfo list(Product product) {
        startPage();
        return getDataTable(productService.listProductByQuery(product));
    }

    /**
     * 商品审核
     * @param id 商品id
     * @param auditStatus 商品审核状态
     * @return
     */
    @Operation(summary = "商品审核")
    @GetMapping("/updateAuditStatus/{id}/{auditStatus}")
    public AjaxResult updateAuditStatus(
            @PathVariable("id") Long id,
            @PathVariable("auditStatus") Byte auditStatus){
        if (auditStatus != 1 && auditStatus!= -1) error("状态信息错误");
        return toAjax(productService.updateAuditStatus(id,auditStatus));
    }

    /**
     * 商品上下架
     * @param id 商品id
     * @param status 商品状态
     * @return
     */
    @Operation(summary = "商品上下架")
    @GetMapping("/updateStatus/{id}/{status}")
    public AjaxResult updateStatus(
            @PathVariable("id") Long id,
            @PathVariable("status") Byte status
    ){
        if (status != 1 && status!= -1) error("状态信息错误");
        return toAjax(productService.updateStatus(id,status));
    }

    /**
     * 新增商品
     * @param product 商品信息
     * @return 插入结果
     */
    @Operation(summary = "新增商品")
    @PostMapping
    public AjaxResult saveProduct(@RequestBody @Validated Product product){
        return toAjax(productService.insertProduct(product));
    }

    /**
     * 修改商品
     * @param product 商品信息
     * @return 修改结果
     */
    @Operation(summary = "修改商品")
    @PutMapping
    public AjaxResult updateProduct(@RequestBody@Validated Product product){
        return toAjax(productService.updateProduct(product));
    }

    /**
     * 批量删除商品
     * @param ids 商品id数组
     * @return 删除结果
     */
    @Operation(summary = "删除商品")
    @DeleteMapping("/{ids}")
    public AjaxResult deleteProduct(@PathVariable("ids") Long[] ids){
        return toAjax(productService.deleteProductByIds(Arrays.asList(ids)));
    }

    /**
     * 根据id获取商品详细信息
     * @param id 商品id
     * @return 商品详细信息
     */
    @Operation(summary = "根据id获取商品详细信息")
    @GetMapping("{id}")
    public AjaxResult getProductById(@PathVariable("id") Long id){
        return success(productService.getInfoById(id));
    }

    /**
     * 获取销量前20的商品sku
     * @return 商品sku
     */
    @InnerAuth
    @Operation(summary ="获取销量前20的商品sku")
    @GetMapping("getTopSale")
    public R<List<ProductSku>> getTopSale(){
        return R.ok(productService.getTopSale());
    }

    /**
     * 分页查询sku列表
     * @param pageNum 起始页
     * @param pageSize 每页记录数
     * @param skuQuery 查询条件
     * @return sku列表
     */
    @InnerAuth
    @GetMapping("/skuList/{pageNum}/{pageSize}")
    @Operation(summary = "获取sku列表")
    public R<TableDataInfo> skuList(
            @Parameter(name = "pageNum", description = "当前页码", required = true)
            @PathVariable Integer pageNum,

            @Parameter(name = "pageSize", description = "每页记录数", required = true)
            @PathVariable Integer pageSize,

            @Parameter(name = "productQuery", description = "查询对象", required = false)
            SkuQuery skuQuery)
    {
        PageHelper.startPage(pageNum, pageSize);
        List<ProductSku> list = productService.selectProductSkuList(skuQuery);
        return R.ok(getDataTable(list));
    }

    /**
     * 根据skuId获取商品sku信息
     * @param skuId skuId
     * @return 商品sku信息
     */
    @Operation(summary = "获取商品sku信息")
    @InnerAuth
    @GetMapping(value = "/getProductSku/{skuId}")
    public R<ProductSku> getProductSku(@PathVariable("skuId") Long skuId)
    {
        return R.ok(productService.getProductSku(skuId));
    }

    /**
     * 根据id获取商品信息
     * @param id 商品id
     * @return  商品信息
     */
    @Operation(summary = "获取商品信息")
    @InnerAuth
    @GetMapping(value = "/getProduct/{id}")
    public R<Product> getProduct(@PathVariable("id") Long id)
    {
        return R.ok(productService.getProduct(id));
    }

    /**
     * 获取商品sku最新价格信息
     * @param skuId 商品skuId
     * @return 商品sku最新价格信息
     */
    @Operation(summary = "获取商品sku最新价格信息")
    @InnerAuth
    @GetMapping(value = "/getSkuPrice/{skuId}")
    public R<SkuPrice> getSkuPrice(@PathVariable("skuId") Long skuId)
    {
        return R.ok(productService.getSkuPrice(skuId));
    }

    /**
     * 获取商品详细信息
     * @param id 商品id
     * @return 商品详细信息
     */
    @Operation(summary = "获取商品详细信息")
    @InnerAuth
    @GetMapping(value = "/getProductDetails/{id}")
    public R<ProductDetails> getProductDetails(@PathVariable("id") Long id)
    {
        return R.ok(productService.getProductDetails(id));
    }

    /**
     * 获取商品sku规格详细信息
     * @param id 商品id
     * @return 商品sku规格详细信息
     */
    @Operation(summary = "获取商品sku规格详细信息")
    @InnerAuth
    @GetMapping(value = "/getSkuSpecValue/{id}")
    public R<Map<String, Long>> getSkuSpecValue(@PathVariable("id") Long id)
    {
        return R.ok(productService.getSkuSpecValue(id));
    }

    /**
     * 获取商品sku库存信息
     * @param skuId 商品skuId
     * @return 商品sku库存信息
     */
    @Operation(summary = "获取商品sku库存信息")
    @InnerAuth
    @GetMapping(value = "/getSkuStock/{skuId}")
    public R<SkuStockVo> getSkuStock(@PathVariable("skuId") Long skuId)
    {
        return R.ok(productService.getSkuStock(skuId));
    }

    /**
     * 批量获取商品sku最新价格信息
     * @param skuIdList 商品skuId列表
     * @return 商品sku最新价格信息
     */
    @Operation(summary = "批量获取商品sku最新价格信息")
    @InnerAuth
    @PostMapping(value = "/getSkuPriceList")
    public R<List<SkuPrice>> getSkuPriceList(@RequestBody List<Long> skuIdList)
    {
        return R.ok(productService.getSkuPriceList(skuIdList));
    }

}
